/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
package eypweb_bsc;

import java.io.File;
import java.net.URL;
import java.sql.*;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventType;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Pos;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

/**
 *
 * @author Baalor
 */

// kepernyovezerlo osztaly
// devizak kezelesehez
public class CurrencyRegistry implements Initializable {
    // feluleti elemek
    
    // gombok
    @FXML
    private Button btnNew;
    @FXML
    private Button btnMod;
    @FXML
    private Button btnCan;
    @FXML
    private Button btnRes;
    @FXML
    private Button btnCom;
    @FXML
    private Button btnEsc;
    // cimke uzenetekhez
    @FXML
    private Label errorLabel;
    // beviteli mezok
    @FXML
    private TextField tfName;
    @FXML
    private TextField tfUnit;
    @FXML
    private TextField tfStart;
    @FXML
    private TextField tfEnd;
    // tablazat
    @FXML
    private TableView<Currency> masterData;

    public CurrencyRegistry() {
        super();
    }

    @FXML
    private void handleNewButtonAction(ActionEvent event) {
        // ha uj elemet akarunk felvenni
        if (btnNew.getText().equals("Új elem"))
        {
            // a gombok statuszat frissiteni kell
            btnMod.setDisable(true);
            btnCom.setDisable(true);
            btnRes.setDisable(true);
            btnCan.setDisable(false);
            btnNew.setText("Rendben");
            tfName.clear();
            tfUnit.clear();
            tfStart.clear();
            tfEnd.clear();
        }
        // ha kesz vagyunk az uj elem adatainak megadasaval
        else
        {
            //kotelezo mezoket meg kell adni
            if (tfName.getText().isEmpty() || tfUnit.getText().isEmpty())
            {
                errorLabel.setText("A mezőket kötelező kitölteni!");
                return;
            }
            // datumformatum ellenorzese
            try{
                Date start = Date.valueOf(tfStart.getText());
                Date end = Date.valueOf(tfEnd.getText());
                if (start.after(end))
                {
                    errorLabel.setText("A kezdődátum nem lehet későbbi, mint a végdátum!");
                    return;
                }
            }
            catch(Exception e)
            {
                errorLabel.setText("A dátum nincs megfelelően formázva!");
                return;
            }
            // uj Currency peldanyositasa a megadott adatokkal
            Currency currency = new Currency();
            currency.setId(0);
            currency.setName(tfName.getText());
            currency.setUnit(tfUnit.getText());
            currency.setStartDate(tfStart.getText());
            currency.setEndDate(tfEnd.getText());
            // uj elem modositottnak szamit
            currency.setModified();
            // tablazatban is meg kell jeleniteni
            masterData.getItems().add(currency);
            // gombok statuszat vissza kell allitani
            btnMod.setDisable(false);
            btnRes.setDisable(false);
            btnCom.setDisable(false);
            btnNew.setText("Új elem");
        }
    }

    
    @FXML
    private void handleModifyButtonAction(ActionEvent event) {
        // ha kijeloltunk egy elemet es modositani akarjuk
        if (btnMod.getText().equals("Módosít")) {
            // az adatait betoltjuk a mezokbe
            Currency selectedItem = masterData.getSelectionModel().getSelectedItem();
            if (selectedItem != null) {
                tfName.setText(selectedItem.getName());
                tfUnit.setText(selectedItem.getUnit());
                tfStart.setText(selectedItem.getStartDate());
                tfEnd.setText(selectedItem.getEndDate());
                // gombok statuszat felulirjuk
                btnMod.setText("Rendben");
                btnNew.setDisable(true);
                btnCom.setDisable(true);
                btnRes.setDisable(true);
                btnCan.setDisable(false);
            }
        } else {
            // ha a modositasokkal kesz vagyunk
            // kotelezo mezok kitolteset figyeljuk
            if (tfName.getText().isEmpty() || tfUnit.getText().isEmpty())
            {
                errorLabel.setText("A mezőket kötelező kitölteni!");
                return;
            }
            // datumformatumot figyeljuk
            try{
                Date start = Date.valueOf(tfStart.getText());
                Date end = Date.valueOf(tfEnd.getText());
                if (start.after(end))
                {
                    errorLabel.setText("A kezdődátum nem lehet későbbi, mint a végdátum!");
                    return;
                }
            }
            catch(Exception e)
            {
                errorLabel.setText("A dátum nincs megfelelően formázva!");
                return;
            }
            // a kivalasztott elem mezoit felulirjuk
            Currency selectedItem = masterData.getSelectionModel().getSelectedItem();
            if (selectedItem != null) {
                selectedItem.setName(tfName.getText());
                selectedItem.setUnit(tfUnit.getText());
                selectedItem.setStartDate(tfStart.getText());
                selectedItem.setEndDate(tfEnd.getText());
                // modositas flag beallitasa
                selectedItem.setModified();
                // gombok statuszanak visszaallitasa
                btnMod.setText("Módosít");
                btnNew.setDisable(false);
                btnCom.setDisable(false);
                btnRes.setDisable(false);
            }
        }
    }

    @FXML
    private void handleCancelButtonAction(ActionEvent event)
    {
        // megse gomb megnyomasara a gombok felveszik
        // eredeti allapotukat  
        btnNew.setDisable(false);
        btnMod.setDisable(false);
        btnRes.setDisable(false);
        btnCom.setDisable(false);
        btnNew.setText("Új elem");
        btnMod.setText("Módosít");
        btnCan.setDisable(true);
    }
    
    @FXML
    private void handleResetButtonAction(ActionEvent event) {
        // visszaalitas gomb megnyomasakor
        // elkerjuk a csatlakozas infokat
        Director director = Director.getInstance();
        AccessInfo ai = director.getAccessInfo();
        // megfigyelheto lista felvetele
        ObservableList<Currency> currencies = FXCollections.observableArrayList();
        try {
            // csatlakozas
            Connection con = DriverManager.getConnection("jdbc:sqlserver://" + ai.getIPAddress() + ":" + ai.getPort() + ";databaseName=" + ai.getDBName(), ai.getUser(), ai.getPass());
            // aktualis torzsadatok lekerdezese
            String CurrencyQuery = "SELECT * FROM deviza WHERE ? BETWEEN hatalytol AND hatalyig";
            PreparedStatement stmt = con.prepareStatement(CurrencyQuery);
            stmt.setDate(1, new Date(new java.util.Date().getTime()));
            ResultSet results = stmt.executeQuery();
            // adatok elmentese
            while (results.next()) {
                Currency currency = new Currency();
                currency.setId(results.getInt(1)); 
                currency.setName(results.getNString(2));
                currency.setUnit(Integer.toString(results.getInt(3)));
                currency.setStartDate(results.getDate(4).toString());
                currency.setEndDate(results.getDate(5).toString());
                // lista bovitese
                currencies.add(currency);
            }
            // kapcsolat lezarasa
            con.close();
        } catch (SQLException sqle) {
            errorLabel.setText(sqle.getMessage());
        }
        // megjelenites
        masterData.setItems(currencies);
    }
    
    @FXML
    private void handleCommitButtonAction(ActionEvent event){
        // vegelegesites gomb megnyomasakor
        Director director = Director.getInstance();
        AccessInfo ai = director.getAccessInfo();
        // lista atvetele a tablazatbol
        ObservableList<Currency> currencies = masterData.getItems();
        try {
            // csatlakozas
            Connection con = DriverManager.getConnection("jdbc:sqlserver://"
                    + ai.getIPAddress() + ":" + ai.getPort() + ";databaseName=" 
                    + ai.getDBName(), ai.getUser(), ai.getPass());
            String insertAction = "exec AddOrModifyCurrency ?,?,?,?,?";
            // a lista minden elemere
            for (Currency crnc : currencies)
            {
                // ha modosult
                if (crnc.getModified()){
                    // meghivjuk a szukseges tarolt eljarast az adataival
                    PreparedStatement insertStmt = con.prepareStatement(insertAction);
                    insertStmt.setInt(1, crnc.getId());
                    insertStmt.setNString(2, crnc.getName());
                    insertStmt.setInt(3, Integer.parseInt(crnc.getUnit()));
                    insertStmt.setDate(4, Date.valueOf(crnc.getStartDate()));
                    insertStmt.setDate(5, Date.valueOf(crnc.getEndDate()));
                    insertStmt.executeUpdate();
                }
            }
            // kapcsolat lezarasa
            con.close();
            // adatok frissitese
            handleResetButtonAction(new ActionEvent());
        } catch (SQLException sqle) {
            errorLabel.setText(sqle.getMessage());
        }
    }

    @FXML
    private void handleEscapeButtonAction(ActionEvent event) {
        // kilepes gomb megnyomasara kilep a fomenubol
        Director director = Director.getInstance();
        director.initializeMainMenu();
    }

    @FXML
    private void handleCSVButtonAction(ActionEvent event) {
        // exportalas CSV-be
        CSVHandler.exportCurrency(masterData.getItems());
    }

    @FXML
    private void handleXLSButtonAction(ActionEvent event) {
        // exportalas Excelbe
        XLSHandler.exportCurrency(masterData.getItems());
    }

    @FXML
    private void handleXMLButtonAction(ActionEvent event) {
        // exportalas XML-be
        XMLHandler.exportCurrency(masterData.getItems());
    }
    
    @FXML
    private void handleRowSelect(MouseEvent event) {
        // ha kivalasztunk egy sort
        if (masterData.getSelectionModel().getSelectedItem() != null) {
            // aktivizaljuk a modosit gombot
            btnMod.setDisable(false);
        }
        else{
            // ha nincs kijelolve egy sor sem, akkor kikapcsoljuk
            btnMod.setDisable(true);
        }
    }

    // a vezerlo letrehozasakor fut le
    public void initialize(URL url, ResourceBundle bundle) {
        // adatok frissities
        handleResetButtonAction(new ActionEvent());

        // tablazat oszlopok definicioja
        TableColumn<Currency, String> nameCol = new TableColumn<Currency, String>("Megnevezés");
        nameCol.setCellValueFactory(new PropertyValueFactory("name"));
        
        TableColumn<Currency, String> unitCol = new TableColumn<Currency, String>("Egység");
        unitCol.setCellValueFactory(new PropertyValueFactory("unit"));

        TableColumn<Currency, String> startCol = new TableColumn<Currency, String>("Hatály kezdete");
        startCol.setCellValueFactory(new PropertyValueFactory("startDate"));

        TableColumn<Currency, String> endCol = new TableColumn<Currency, String>("Hatály vége");
        endCol.setCellValueFactory(new PropertyValueFactory("endDate"));
        
        // ozslopok rendelese a tablazathoz
        masterData.getColumns().setAll(nameCol, unitCol, startCol, endCol);
    }
}